use futures::executor::block_on;
use std::thread;
use std::time::Duration;

/*
    Rust 使用async/await 关键字来编写像同步代码一样的异步函数。
    async 将一个代码块转换为一个实现了Future的 trait 的状态机。
    以前我们在同步方法中调用阻塞函数，（比如数据库id操作）会阻塞整个当前线程，
    但如果使用了async 阻塞的futures的将让出线程控制权，允许其它Futures执行，
    这就类似，在当前线程下，派生出一个子线程去处理io，然后当前线程可以继续执行下面的代码。
 */


fn main() {
    let future = hello(); // 这里调用hello()不会立马执行
    println!("在hello方法执行完前，执行");
    block_on(future);// 这个函数在当前线程中执行一个future，直到其完成为止。
    println!("async hello() 完成!")
}

async fn hello() {
    thread::sleep(Duration::from_secs(1)); // 假设这里处理要1秒
    println!("rust async hello");
}

async fn learn_song() {
    println!("learn song...");
    thread::sleep(Duration::from_secs(1));
}

